﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Data;
using NGI_BaseDatos;
using NGI_Entidades;
using NGI_Auxiliares;

namespace NGI_Logica
{
    public class Clientes
    {
        public static EntidadCuentaCorriente[] TraerCuentaCorriente(Boolean MostrarTodos, Boolean SoloDeuda)
        {
            EntidadCuentaCorriente[] Listado;

            Parametro[] ListadoParametros = new Parametro[2];
            ListadoParametros[0] = new Parametro("@bitTodos", MostrarTodos);
            ListadoParametros[1] = new Parametro("@bitSoloPositivos", SoloDeuda);

            DataTable dt = BaseDatos.Traer("proc_ObtenerCuentaCorrienteDeClientes", ListadoParametros);
            if (dt.Rows.Count == 0)
                return new EntidadCuentaCorriente[0];

            Listado = new EntidadCuentaCorriente[dt.Rows.Count];
            int Contador = 0;
            foreach (DataRow dr in dt.Rows)
            {
                EntidadCuentaCorriente unCliente = EntidadCuentaCorriente.Entidad(Convert.ToInt32(dr["ID"].ToString()), dr["RazonSocial"].ToString(), dr["CUIT"].ToString(), Math.Round(Convert.ToDouble(dr["Adeudado"].ToString()), 2), Convert.ToBoolean(dr["Activo"].ToString()));
                Listado[Contador] = unCliente;
                Contador++;
            }

            return Listado;
        }

        public static ArrayList CargarTodos()
        {
            ArrayList ListadoClientes;

            DataTable dt = BaseDatos.Traer("proc_ObtenerClientesExistentesParaListar");
            if (dt.Rows.Count == 0)
                return new ArrayList();

            ListadoClientes = new ArrayList();
            foreach (DataRow dr in dt.Rows)
            {
                Cliente unCliente= Cliente.ParaListar(Convert.ToInt32(dr["ID"].ToString()), dr["RazonSocial"].ToString());
                ListadoClientes.Add(unCliente);
            }

            return ListadoClientes;
        }

        public static ArrayList CargarTodosConCUIT()
        {
            ArrayList ListadoClientes;

            DataTable dt = BaseDatos.Traer("proc_ObtenerClientesExistentesParaListarConCUIT");
            if (dt.Rows.Count == 0)
                return new ArrayList();

            ListadoClientes = new ArrayList();
            foreach (DataRow dr in dt.Rows)
            {
                Cliente unCliente = Cliente.ParaListar(Convert.ToInt32(dr["ID"].ToString()), dr["Descripcion"].ToString());
                ListadoClientes.Add(unCliente);
            }

            return ListadoClientes;
        }

        public static ArrayList CargarActivosParaFacturar(Boolean FacturaA)
        {
            ArrayList ListadoClientes;

            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@bitFacturaA", FacturaA);

            DataTable dt = BaseDatos.Traer("proc_ObtenerClientesDisponiblesParaFacturar", ListadoParametros);
            if (dt.Rows.Count == 0)
                return new ArrayList();

            ListadoClientes = new ArrayList();
            foreach (DataRow dr in dt.Rows)
            {
                Cliente unCliente = Cliente.ParaListar(Convert.ToInt32(dr["ID"].ToString()), dr["RazonSocial"].ToString());
                ListadoClientes.Add(unCliente);
            }

            return ListadoClientes;
        }

        public static Cliente TraerDatosDe(Int32 Id)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intClienteID", Id);

            DataTable dt = BaseDatos.Traer("proc_ObtenerCliente", ListadoParametros);
            if (dt.Rows.Count == 0)
                return new Cliente();

            DataRow dr = dt.Rows[0];

            dt = BaseDatos.Traer("proc_ObtenerTelefonosDeCliente", ListadoParametros);

            if (String.IsNullOrEmpty(dr["Adeudado"].ToString())) dr["Adeudado"] = "0";

            Double Deuda = Convert.ToDouble(dr["Adeudado"].ToString()) < 0 ? -Convert.ToDouble(dr["Adeudado"].ToString()) : Convert.ToDouble(dr["Adeudado"].ToString());
            Telefono[] Telefonos;
            Cliente unCliente;
            Provincia unaProvincia = Provincia.DatosMinimos(Convert.ToInt32(dr["Provincia_Id"].ToString()));
            if (dt.Rows.Count > 0)
            {
                Telefonos = new Telefono[dt.Rows.Count];
                Int32 a = 0;
                foreach (DataRow drTel in dt.Rows)
                {
                    Telefonos[a] = Telefono.Existente(Convert.ToInt32(drTel["Id"].ToString()), TipoTelefono.DameCodigoDe(Convert.ToInt32(drTel["TipoTelefono_Id"].ToString())), drTel["Numero"].ToString(), Convert.ToBoolean(drTel["Activo"].ToString()));
                    a++;
                }

                unCliente = Cliente.Existente(Convert.ToInt32(dr["Id"].ToString()), dr["CUIT"].ToString(), dr["RazonSocial"].ToString(), dr["Email"].ToString(), dr["Direccion"].ToString(), dr["CodigoPostal"].ToString(), dr["Ciudad"].ToString(), dr["Localidad"].ToString(), unaProvincia, dr["Contacto"].ToString(), dr["IngresosBrutos"].ToString(), Convert.ToInt32(dr["ISIB"].ToString()), Deuda, CategoriaIVA.DatosMinimos(Convert.ToInt32(dr["CategoriaIVA"].ToString())), Telefonos, Convert.ToBoolean(dr["Activo"].ToString()));
            }
            else
            {
                unCliente = Cliente.Existente(Convert.ToInt32(dr["Id"].ToString()), dr["CUIT"].ToString(), dr["RazonSocial"].ToString(), dr["Email"].ToString(), dr["Direccion"].ToString(), dr["CodigoPostal"].ToString(), dr["Ciudad"].ToString(), dr["Localidad"].ToString(), unaProvincia, dr["Contacto"].ToString(), dr["IngresosBrutos"].ToString(), Convert.ToInt32(dr["ISIB"].ToString()), Convert.ToDouble(dr["SaldoTotal"].ToString()), Deuda, CategoriaIVA.DatosMinimos(Convert.ToInt32(dr["CategoriaIVA"].ToString())), Convert.ToBoolean(dr["Activo"].ToString()));
            }

            dt = BaseDatos.Traer("proc_ObtenerPagosDeCliente", ListadoParametros);
            Pago[] Pagos = new Pago[dt.Rows.Count];

            Int32 counter = 0;
            foreach (DataRow drPago in dt.Rows)
            {
                try
                {
                    Pagos[counter] = Pago.Existente(Convert.ToInt32(drPago["Id"].ToString()), Cliente.SinDatos(Id), Convert.ToDouble(drPago["MontoTotal"].ToString()), Convert.ToDouble(drPago["MontoPagado"].ToString()), Convert.ToDateTime(drPago["Fecha"].ToString()), Convert.ToBoolean(drPago["Activo"].ToString()));
                }
                catch (Exception Ex)
                {

                }
                counter++;
            }
            unCliente.Pagos = Pagos;

            return unCliente;
        }

        public static void InsertarTelefonos(Cliente unCliente, Int32 UsuarioLogueadoID)
        {
            Parametro[] ListadoParametros = new Parametro[5];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
            ListadoParametros[1] = new Parametro("@intClienteID", unCliente.ID);

            foreach (Telefono Tel in unCliente.Telefonos)
            {
                ListadoParametros[2] = new Parametro("@intTipoTelefonoID", TipoTelefono.DameIndiceDe(Tel.Tipo));
                ListadoParametros[3] = new Parametro("@chvNumero", Tel.Numero);
                ListadoParametros[4] = new Parametro("@bitActivo", Tel.Activo);
                BaseDatos.Ejecutar("proc_InsertarTelefonoDeCliente", ListadoParametros);
            }
        }



        public static void EliminarTelefonos(Cliente unCliente)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intClienteID", unCliente.ID);
            BaseDatos.Ejecutar("proc_EliminarTelefonosDeUnCliente", ListadoParametros);
        }

        public static void EliminarPagos(Cliente unCliente)
        {
            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intClienteID", unCliente.ID);
            BaseDatos.Ejecutar("proc_EliminarPagos", ListadoParametros);
        }

        public static void Eliminar(Int32 IDCliente)
        {

            Parametro[] ListadoParametros = new Parametro[1];
            ListadoParametros[0] = new Parametro("@intClienteID", IDCliente);
            BaseDatos.Ejecutar("proc_EliminarCliente", ListadoParametros);
        }

        public static int Crear(Cliente unCliente, Int32 UsuarioLogueadoID)
        {
            Parametro[] ListadoParametros = new Parametro[14];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
            ListadoParametros[1] = new Parametro("@chvCUIT", unCliente.CUIT);
            ListadoParametros[2] = new Parametro("@chvRazonSocial", unCliente.RazonSocial);
            ListadoParametros[3] = new Parametro("@chvEmail", unCliente.Email);
            ListadoParametros[4] = new Parametro("@chvDireccion", unCliente.Direccion);
            ListadoParametros[5] = new Parametro("@chvCodigoPostal", unCliente.CodigoPostal);
            ListadoParametros[6] = new Parametro("@chvCiudad", unCliente.Ciudad);
            ListadoParametros[7] = new Parametro("@intProvinciaID", unCliente.Provincia.ID);
            ListadoParametros[8] = new Parametro("@chvContacto", unCliente.Contacto);
            ListadoParametros[9] = new Parametro("@intCategoriaIVA", unCliente.CategoriaIVA.ID);
            ListadoParametros[10] = new Parametro("@chvIngresosBrutos", unCliente.IngresosBrutos);
            ListadoParametros[11] = new Parametro("@intISIB", unCliente.ISIB);
            ListadoParametros[12] = new Parametro("@chvLocalidad", unCliente.Localidad);
            ListadoParametros[13] = new Parametro("@bitActivo", unCliente.Activo);

            return Convert.ToInt32(BaseDatos.Ejecutar("proc_InsertarCliente", ListadoParametros));
         }

        public static void Modificar(Cliente unCliente, Int32 UsuarioLogueadoID)
        {
            Parametro[] ListadoParametros = new Parametro[15];
            ListadoParametros[0] = new Parametro("@intUsuarioID", UsuarioLogueadoID);
            ListadoParametros[1] = new Parametro("@chvCUIT", unCliente.CUIT);
            ListadoParametros[2] = new Parametro("@chvRazonSocial", unCliente.RazonSocial);
            ListadoParametros[3] = new Parametro("@chvEmail", unCliente.Email);
            ListadoParametros[4] = new Parametro("@chvDireccion", unCliente.Direccion);
            ListadoParametros[5] = new Parametro("@chvCodigoPostal", unCliente.CodigoPostal);
            ListadoParametros[6] = new Parametro("@chvCiudad", unCliente.Ciudad);
            ListadoParametros[7] = new Parametro("@intProvinciaID", unCliente.Provincia.ID);
            ListadoParametros[8] = new Parametro("@chvContacto", unCliente.Contacto);
            ListadoParametros[9] = new Parametro("@intCategoriaIVA", unCliente.CategoriaIVA.ID);
            ListadoParametros[10] = new Parametro("@intClienteID", unCliente.ID);
            ListadoParametros[11] = new Parametro("@chvIngresosBrutos", unCliente.IngresosBrutos);
            ListadoParametros[12] = new Parametro("@intISIB", unCliente.ISIB);
            ListadoParametros[13] = new Parametro("@chvLocalidad", unCliente.Localidad);
            ListadoParametros[14] = new Parametro("@bitActivo", unCliente.Activo);

            BaseDatos.Ejecutar("proc_ModificarCliente", ListadoParametros);
        }
    }
}
